package com.cysoft.starter.repeat.core.validata.impl;

import com.cysoft.starter.repeat.core.helper.CaffeineCacheHelper;
import com.cysoft.starter.repeat.core.model.RepeatInfo;
import com.cysoft.starter.repeat.core.validata.RepeatValidata;
import com.github.benmanes.caffeine.cache.LoadingCache;
import lombok.extern.slf4j.Slf4j;

/**
 * @author 玖零
 * @version V0.0.1
 * @project cysoft-spring-boot-starter-repeat
 * @package com.cysoft.starter.repeat.core.validata.impl
 * @date 2025-03-02 16:33
 * @desc
 */
@Slf4j
public class CaffeineRepeatValidata implements RepeatValidata {


    private final LoadingCache<String, Boolean> cache;


    /**
     * 构造函数，初始化 CaffeineRepeatValidata 类的实例
     */
    public CaffeineRepeatValidata() {
        this.cache = CaffeineCacheHelper.createCache(1);
    }


    /**
     * 实现重复验证
     *
     * @param repeatInfo 包含请求键和过期时间等信息的对象
     * @return 如果是重复请求返回 true，否则返回 false
     */
    @Override
    public boolean validataRepeat(RepeatInfo repeatInfo) {
        // 获取请求的唯一标识键
        String requestKey = repeatInfo.getRequestKey();
        // 检查缓存中是否已经存在该请求的验证结果
        Boolean isRepeat = cache.getIfPresent(requestKey);
        if (isRepeat != null) {
            // 如果缓存中存在结果，直接返回
            return isRepeat;
        }

        try {
            // 尝试将请求键存入缓存，如果键不存在则存入并返回 null
            isRepeat = cache.get(requestKey, key -> {
                // 使用工具类动态设置过期时间
                CaffeineCacheHelper.setExpiry(cache, key, repeatInfo.getExpireTime(), repeatInfo.getExpireTimeUnit());
                return true;
            });

            // 返回验证结果
            return isRepeat;
        } catch (Exception e) {
            // 捕获缓存操作过程中的异常并打印错误信息
            log.error("Caffeine 缓存操作异常 e:{}",e.getMessage());
            // 出现异常时默认返回非重复请求
            return false;
        }
    }
}
